package order.producer;

import order.bean.OrderStep;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.client.producer.selector.SelectMessageQueueByHash;
import org.apache.rocketmq.common.message.Message;

import java.nio.charset.Charset;
import java.util.List;

/**
 * order包 ，顺序消息实例
 * OrderMsgProducer 顺序消息生产者
 * 一个broker有多个queue,根据业务的唯一表示,把同一个订单的业务发送给同一个queue，再用一个线程去消费。
 * 可以实现局部的顺序消息。
 * @author: BacHe
 * @email: 1218585258@qq.com
 * @Date: 2020/12/8 22:56
 */
public class OrderMsgProducer {
    public static void main(String[] args) throws Exception {
        //1.创建消息生产者 producer，并指定生产者组名 group1
        DefaultMQProducer producer = new DefaultMQProducer("group4");
        //2.指定Nameserver地址,集群用分号;隔开 。
        // （注意防火墙要开放指定端口,Nameserver端口9876 ,broker端口10911,broker要设置配置文件启动）
        producer.setNamesrvAddr("192.168.0.88:9876");
        //3.启动producer
        producer.start();

        List<OrderStep> list = OrderStep.getList();

        for (OrderStep orderStep : list) {
            Message message = new Message();
            message.setTopic("order");
            message.setTags("tag4");
            message.setBody(orderStep.toString().getBytes(Charset.forName("UTF-8")));

            //todo 发送顺序消息
            /**
             * 参数1：消息
             * 参数2:SelectMessageQueueByHash 队列queue选择器，通过哈希。
             * 参数3：订单ID,用于哈希计算。使得同一个订单的消息发送给同一个queue，保证消息顺序发送
             */
            SendResult result = producer.send(message, new SelectMessageQueueByHash(), orderStep.getOrderId());
            System.out.println(result);
        }
        //6.关闭生产者producer
        producer.shutdown();
    }
}
